#include <iostream>
#include <cstdlib>
#include <signal.h>
#include <unistd.h>
#include <cassert>
#include <sys/wait.h>
#include <sys/types.h>

using namespace std;

// 进程的非阻塞等待方案
void FreeChld(int signo) {
    assert(signo == SIGCHLD);
    while (true) {
        // -1 表示等待任意子进程，当没有子进程的时候调用失败
        // 非阻塞式等待任何一个子进程，返回值 > 0 表示等待成功
        pid_t id = waitpid(-1, nullptr, /* 0 */ WNOHANG);
        // 如果 id == 0 ，那么还有子进程，但是还没有退出
        if (id > 0) {
            cout << "wait successful chld pid = " << id << endl; 
        }
        else if (id == 0) {
            cout << "还有子进程，但是这个子进程还没有退出";
            break;
        }
        else { // wait fail
            break;
        }
    }
}

int main() {
    signal(SIGCHLD, FreeChld);

    int id = fork();
    if (id == 0) {
        while (true) {
            cout << "子进程 pid = " << getpid() << endl;
            sleep(1);
        }
        exit(0);
    }
    while (true) {
        cout << "父进程" << endl;
        sleep(1);
    }
}